package com.liu.shrio02.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {


    /**
     * 创建realm对象
     * DefaultWebSecurityManage 默认
     * ShiroFilterFactoryBean  过滤工厂对象
     */


    //3.ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("getSecurityManage") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        /* 设置安全管理器 */
        factoryBean.setSecurityManager(defaultWebSecurityManager);
        //添加shiro的内置过滤器
        /**
         * anon：无需认证就可以访问
         * authc：必须认证了才可以访问
         * user：必须拥有 记住我 功能才能用
         * perms：拥有对某个资源的权限才能访问
         * role：拥有某个角色权限
         */
        Map<String, String> filterMap = new LinkedHashMap<>();
        //filterMap.put("/user/add","anon");
        filterMap.put("/user/add","perms[user:add]");
        filterMap.put("/user/delete","perms[user:delete]");
        filterMap.put("/user/update","authc");
        factoryBean.setFilterChainDefinitionMap(filterMap);
        /* 请求登录 */
        factoryBean.setLoginUrl("/toLogin");
        /* 未授权 */
        factoryBean.setUnauthorizedUrl("/user/noauth");
        return factoryBean;
    }

    //2.创建DefaultWebSecurityManage
    @Bean(name = "getSecurityManage")
    public DefaultWebSecurityManager getSecurityManage(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        //关联Realm
        securityManager.setRealm(userRealm);

        return securityManager;
    }
    //1.创建realm对象
    @Bean(name = "userRealm")
    public UserRealm userRealm(){
        return new UserRealm();
    }


    //整合ShiroDialect ： 整合shiro 和 thymeleaf
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}
